package ar.fiuba.fallar2.pac_man.utils;

import java.awt.Point;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import ar.fiuba.fallar2.pac_man.AbstractCelda;
import ar.fiuba.fallar2.pac_man.fantasma.model.Fantasma;
import ar.fiuba.fallar2.pac_man.fantasma.persist.FantasmaDataMapper;
import ar.fiuba.fallar2.pac_man.fruta.model.Fruta;
import ar.fiuba.fallar2.pac_man.fruta.persist.FrutaDataMapper;
import ar.fiuba.fallar2.pac_man.pildora.model.Pildora;
import ar.fiuba.fallar2.pac_man.pildora.persist.PildoraDataMapper;

public class Mapa {
    final private int VELOCIDAD_INICIAL = 15;
   
    private Matriz matriz;
    private Point  iniPacman;
    private int    puntosSinComer;
    private int    puntajePremio;
    List    	   listaFantasmas = null;
    List           listaFrutas=null;
    
    public List getListaFantasmas() {
		return listaFantasmas;
	}

	public void setListaFantasmas(List listaFantasmas) {
		this.listaFantasmas = listaFantasmas;
	}

	public List getListaPildoras() {
		return listaPildoras;
	}

	public void setListaPildoras(List listaPildoras) {
		this.listaPildoras = listaPildoras;
	}

	public List getListaFrutas() {
		return listaFrutas;
	}



	List           listaPildoras=null;
    public Mapa(int N,int M,Point pacman,int puntos) throws  RuntimeException
    {
            if(N<=0 | M<=0){
                    throw new   RuntimeException();
            }
           
            
            this.puntosSinComer = puntos;
            this.matriz = new Matriz(N,M);
            this.iniPacman = pacman;
            this.listaFantasmas = new ArrayList();
            this.listaFrutas = new ArrayList();
            this.listaPildoras = new ArrayList();
                    
    }
   
    public void crearPersonajes(){
           //cargo los fantasmas    	
           FantasmaDataMapper fantasmaMapper =new FantasmaDataMapper();
    	   List lista= fantasmaMapper.findAll();
           Iterator it=lista.iterator();
           while(it.hasNext())
           {
        	   Fantasma f=(Fantasma)it.next();
        	   this.listaFantasmas.add(f);
                  
           }
    	   
    }
     
    
    public void crearFrutasYPildoras(){
        //cargo     	
       FrutaDataMapper frutaMapper =new FrutaDataMapper();
 	   List lista= frutaMapper.findAll();
        Iterator it=lista.iterator();
        while(it.hasNext())
        {
     	   Fruta f=(Fruta)it.next();
     	   this.listaFrutas.add(f);
               
        }
 	   
       PildoraDataMapper pildoraMapper =new PildoraDataMapper();
  	    lista= pildoraMapper.findAll();
         it=lista.iterator();
         while(it.hasNext())
         {
      	   Pildora p=(Pildora)it.next();
      	   this.listaPildoras.add(p);
                
         }
  	 
    
    }
  
  
    public List getFantasmas(){
            return this.listaFantasmas;
    }
   
   
    public void restarPunto(){
            if (this.puntosSinComer == 0){
            	   throw new RuntimeException();
            }
            this.puntosSinComer = this.puntosSinComer -1;
            if(this.puntosSinComer == 0) return;
                   // return deberia volver que paso de nivel
    }

    public void agregar(Point punto, AbstractCelda celda) throws  RuntimeException
    {
           
                    this.matriz.agregar(celda, punto.x, punto.y);
                    
    }
    

    public int getPuntosSinComer() {                
            return this.puntosSinComer;
    }

    public AbstractCelda getCelda(Point punto){
    	AbstractCelda celda = null;
        try{
                celda = this.matriz.getCelda(punto.x, punto.y);
        }catch (RuntimeException e){
        	   throw new   RuntimeException();
        }
       
        return celda;

}
    public void setCelda(Point punto,AbstractCelda celda){
        try{
            this.matriz.agregar(celda,punto.x, punto.y);
        }catch (RuntimeException e){
        	   throw new   RuntimeException();
        }
       
      
}

    public int getN() {
           
            return this.matriz.getFilas();
    }

    public int getM() {
           
            return this.matriz.getColumnas();
    }

    
   
    public void setPuntajePremio(int puntos) {
            this.puntajePremio = puntos;
           
    }

    public int getPuntajePremio() {
           
            return this.puntajePremio;
    }

  

    public Point getPosicionInicialPacman() {
           
            return this.iniPacman;
    }

    
    public Point getDimensiones(){
        return new Point(this.getN(), this.getM());
}

    
}

